package com.iamteer.b_dataFilter;

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DataFilter implements Filter {

	// 初始化无效数据
	private List<String> dirtyData;
	
	@Override
	public void init(FilterConfig arg0) throws ServletException {
		dirtyData = new ArrayList<String>();
		dirtyData.add("NND");
		dirtyData.add("CNM");
		dirtyData.add("MLGB");
		dirtyData.add("炸学校");
		dirtyData.add("六四");
	}

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
			throws IOException, ServletException {
		// 转型
		final HttpServletRequest request = (HttpServletRequest) arg0;
		HttpServletResponse response = (HttpServletResponse) arg1;
		
		// 一、处理公用业务
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		
		/*
		 * GET 可能会出现乱码，因为request.getParameter 方法内部没有对提交方式进行判断处理
		 * String userName = request.getParameter("userName");
		 * 通过代理解决
		 */
		HttpServletRequest proxy = (HttpServletRequest) Proxy.newProxyInstance(
				request.getClass().getClassLoader(),	// 指定当前使用的类加载器
				new Class[]{HttpServletRequest.class},	// 对目标对象实现的接口类型
				new InvocationHandler() {
					
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						// 定义方法返回值
						Object returnValue = null;
						// 获取方法名
						String methodName = method.getName();
						// 判断：对 getParameter 方法进行 GET 提交中文处理
						if ("getParameter".equals(methodName)) {
							// 获取请求数据值
							String value = request.getParameter(args[0].toString());
							//获取提交方式
							String submitMethod = request.getMethod();
							// 判断如果是 GET 方式提交，需要对数据进行处理（POST 提交已经处理过了）
							if ("get".equalsIgnoreCase(submitMethod)) {
								if (value != null && !"".equals(value.trim())) {
									// 改变编码方式
									value = new String(value.getBytes("UTF-8"), "UTF-8");
								}
							}
							
							// 中文数据已经处理完：下面进行无效数据过滤
							// [如果 value 中出现dirtyData 中数据，用****替换]
							for (String data:dirtyData) {
								// 判断当前输入数据（value）是否包含无效数据，有则替换
								if (value.contains(data)) {
									value = value.replace(data, "****");
								}
							}
							
							return value;
						} else {
							// 执行 request 对象的其他方法
							returnValue = method.invoke(request, args);
						}
						
						return returnValue;
					}
				});
		
		// 二、放行（执行下一个过滤器或者 servlet）
		arg2.doFilter(proxy, response);
		
	}


	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}
}
